// function sum(x, y) { return x + y; }  // 函数声明  会函数提升

// let sum = function(x, y) { //函数表达式
//   return x + y
// }


console.log(sum); // undefined
var sum = function(x, y) {
  return x + y;
}

console.log(sum);// sum is not undefined
let sum = function(x, y) {
  return x + y;
}

let sum = (x, y) => {   //   =>  左边是参数, 右边是函数体
  return x + y; 
}
// 当函数体只有1行,且return时,可以简写
let sum = (x, y) => x + y

let oBtn = document.querySelector('#btn')
oBtn.addEventListener('click', function() {
  window.setTimeout(function() {
    //call apply bind
    console.log(this);
  }.bind(this),1000) 
})

// 用箭头函数
oBtn.addEventListener('click',function() { // 箭头函数中本身没有this,继承了外面一层执行上下午的this
  setTimeout(() => {
    console.log(this);
  },1000)
})

// 类
function People(name, age) {
  console.log(this); // this指向 p1
  this.name = name
  this.age = age
}
let p1 = new People('yk', 25)
console.log(p1);

// 箭头函数指向定义时所在的对象,而不是调用时所在的对象
// 不可以当构造函数
// 不可以使用arguments对象